<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- 由于 JavaScript 的限制，Vue 不能检测数组和对象的变化。 -->

        <!-- 对于对象 -->
        <!-- Vue 无法检测 property 的添加或移除。 -->
        <!-- 由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化，
            所以 property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的。 -->

        {{ someObject }}
        {{ items }}
        {{ message }}
    </div>

    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                a: 1,
                someObject: {},
                items: [11, 22, 33],
                message: 'message',
            },
        })

        // vm.b = 2  => 报错，property需初始化定义好，而不能使用此方法动态添加。

        // 可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式 property。
        Vue.set(vm.someObject, 'b', 2)
        // 可以使用 vm.$set 实例方法，这也是全局 Vue.set 方法的别名：
        vm.$set(vm.someObject, 'c', 3)

        // 为已有对象赋值多个新 property，这样添加到对象上的新 property 不会触发更新。
        // 应该用原对象与要混合进去的对象的 property 一起创建一个新的对象。
        // 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
        vm.someObject = Object.assign({}, vm.someObject, { d: 4, e: 5 })


        // --------------------------（此处有问题）
        // 对于数组：
        // 当利用索引直接设置一个数组项时：不是响应式
        vm.items[1] = 55
        // 当修改数组的长度时：不是响应式
        vm.items.length = 2
        // 用以下可触发状态更新
        Vue.set(vm.items, 1, 55)
        vm.$set(vm.items, 1, 55)
        vm.items.splice(1, 1, 55)

        // ----------------------
        vm.message = 'new message'
        Vue.nextTick(function () {
        })





    </script>
</body>

</html>